<?php
include_once BXD_INCLUDEPATH . 'lib/Validator.php';

/**
 * Classe per la validazione delle Entity
 *
 * @author Damiano Ciarla
 * @version 1.0
 * @category lib/entity
 */
class EntityValidator
{
	private static $istance = null;		//--> Istanza della Classe

	/**
	 * Restituisce l'istanza della classe EntityValidator qualora questa fosse già
	 * stata istanziata altrimenti ne viene creata una nuova e viene restituita.
	 *
	 * @return EntityValidator Istanza della classe EntityValidator
	 */

	static function getInstance()
	{
        if (self::$istance == null)
            self::$istance = new EntityValidator();

        return self::$istance;
    }

    /**
	 * Il seguente metodo si occupa di validare l'entita' che estende la seguente classe
	 * Per ogni variabile della Entity viene effettuato prima il controllo sull'obbligatorieta'
	 * del campo e poi vengono controllati rispettivamente il valore MYSQL e le regole impostate
	 * per ogni variabile della Entity.
	 *
	 * Si ricorda che il metodo istanzia l'errore nella classe Error in modo da poter essere
	 * stampato successivamente alla validazione
	 *
	 * @return boolean Risultato della validazione
	 */

	public function validate($entity)
	{
		//--> Inizializzo il Validator e carico eventuali cartelle per la ricerca dei controlli Validate

		$validator = new Validator("ValidateEntity" . get_class($entity));

		$error = 0;

		foreach ($entity->_getVars() as $name => $value) //--> Ciclo l'array delle variabili
		{
			$valueVar = call_user_func_array(array($entity, "get" . ucfirst($name)), array());

			$nameField = ucfirst($name);

			if($value['LABEL'] !== NULL && is_string($value['LABEL']))
				$nameField = $value['LABEL'];

			if($value['REQUIRED']) //--> Controllo se il valore e' obbligatorio o meno
			{
				if($valueVar === "" || $valueVar === NULL)
				{
					$error++;

					ErrorManager::getInstance()->addError(T::_("Il campo") . " <b><u>" . $nameField . "</u></b> " . T::_("è obbligatorio"));
				}
			}

			//--> Eseguo la validazione per il tipo di dato tramite la il metodo della classe Validator

			$valid = $validator->checkNow("Entity" . $value['TYPE'], $name, $valueVar);

			if(!$valid) $error++;

			if(count($value['RULES']) > 0) //--> Controllo se ci sono delle regole instanziate
			{
				foreach ($value['RULES'] as $rule)
				{
					//--> Eseguo i controlli per le regole impostate

					$valid = $validator->checkNow($rule->getRule(), $nameField, $valueVar, $rule->getValue());

					if(!$valid) $error++;
				}
			}
		}

		if($error > 0) return false;

		return true;
	}

	/**
	 * Restituisce gli errori della validazione qualora fossero presenti
	 */

	public function getError($entity)
	{
		return ErrorManager::getInstance()->getErrorListHTML("ValidateEntity" . get_class($entity));
	}
}
?>
